$\newcommand{\R}{\mathbf{R}} \newcommand{\C}{\mathbf{C}} \newcommand{\A}{\mathcal{A}} \newcommand{\cF}{\mathcal{F}} \newcommand{\SPAN}{\text{span}} \newcommand{\B}{\mathcal{B}} \newcommand{\calL}{\mathcal{L}} \renewcommand{\u}{\mathbf{u}} \newcommand{\uu}{\mathbf{u}} \newcommand{\e}{\mathbf{e}} \newcommand{\vv}{\mathbf{v}} \newcommand{\w}{\mathbf{w}} \newcommand{\ww}{\mathbf{w}} \newcommand{\x}{\mathbf{x}} \newcommand{\xx}{\mathbf{x}} \newcommand{\y}{\mathbf{y}} \newcommand{\yy}{\mathbf{y}} \newcommand{\Cbar}{\overline{\mathbf{C}}} \newcommand{\Dbar}{\overline{\mathbf{D}}} \newcommand{\X}{\mathbf{X}} \newcommand{\Y}{\mathbf{Y}}$ \newcommand{\Xbar}{\widehat{\mathbf{X}}} \newcommand{\Ybar}{\widehat{\mathbf{Y}}} \newcommand{\zz}{\mathbf{z}} \renewcommand{\a}{\mathbf{a}} \renewcommand{\aa}{\mathbf{a}} \newcommand{\bb}{\mathbf{b}} \newcommand{\cc}{\mathbf{c}} \newcommand{\ee}{\mathbf{e}} \newcommand{\hh}{\mathbf{h}} \newcommand{\m}{\mathbf{m}} \newcommand{\0}{\mathbf{0}} \newcommand{\ve}[1]{\mathbf{#1}} \newcommand{\col}[1]{\ifmmode\begin{bmatrix}#1\end{bmatrix}\else $\begin{bmatrix}#1\end{bmatrix}$\fi} \newcommand{\scol}[1]{\left[\begin{smallmatrix}#1\end{smallmatrix}\right]} \newcommand{\rref}{\operatorname{rref}} \newcommand{\hide}[1]{{}} \newcommand{\proj}{\operatorname{\mathbf{Proj}}} \newcommand{\Span}{\operatorname{span}} \newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}} \newcommand{\pdt}[2]{\tfrac{\partial #1}{\partial #2}} \newcommand{\pdd}[2]{\dfrac{\partial #1}{\partial #2}} \newcommand{\svdots}{\raisebox{3pt}{$\scalebox{.75}{\vdots}$}} \newcommand{\sddots}{\raisebox{3pt}{$\scalebox{.75}{$\ddots$}$}} \DeclareMathOperator{\Aut}{Aut} \DeclareMathOperator{\Char}{char} \DeclareMathOperator{\Cl}{Cl} \DeclareMathOperator{\codim}{codim} \DeclareMathOperator{\coker}{coker} \DeclareMathOperator{\disc}{disc} \DeclareMathOperator{\dist}{dist} \DeclareMathOperator{\Div}{Div} \DeclareMathOperator{\End}{End} \DeclareMathOperator{\Eth}{Eth} \DeclareMathOperator{\Frac}{Frac} \DeclareMathOperator{\Free}{Free} %\DeclareMathOperator{\frob}{frob} %\DeclareMathOperator{\Gal}{Gal} %\DeclareMathOperator{\genus}{genus} %\DeclareMathOperator{\Hecke}{Hecke} \DeclareMathOperator{\Hom}{Hom} %\DeclareMathOperator{\id}{id} %\DeclareMathOperator{\im}{im} \DeclareMathOperator{\lcm}{lcm} \DeclareMathOperator{\Mat}{Mat} \DeclareMathOperator{\modulo}{\medspace mod} \DeclareMathOperator{\Norm}{N} %\DeclareMathOperator{\nullity}{nullity} \DeclareMathOperator{\ord}{ord} \DeclareMathOperator{\Pic}{Pic} %\DeclareMathOperator{\rank}{rank} \DeclareMathOperator{\red}{red} \DeclareMathOperator{\res}{res} \DeclareMathOperator{\sgn}{sgn} %\DeclareMathOperator{\Span}{span} \DeclareMathOperator{\Spec}{Spec} \DeclareMathOperator{\Split}{Split} \DeclareMathOperator{\Sturm}{Sturm} \DeclareMathOperator{\Supp}{Supp} \DeclareMathOperator{\Tate}{Tate} \DeclareMathOperator{\tors}{tors} %\DeclareMathOperator{\tr}{tr} \DeclareMathOperator{\val}{val} \DeclareMathOperator{\Weil}{Weil} \DeclareMathOperator{\sech}{sech} \newcommand{\adjacent}{\leftrightarrow} \DeclareMathOperator{\GL}{GL} \DeclareMathOperator{\SL}{SL} \DeclareMathOperator{\PGL}{PGL} \DeclareMathOperator{\PSL}{PSL} \DeclareMathOperator{\SO}{SO} \newcommand{\cm}{\text{,}} %\newcommand{\pd}{\text{.}} \newcommand{\n}{\noindent} \newcommand{\Omicron}{\mathrm{O}} \newcommand{\Zeta}{\mathrm{Z}} \renewcommand{\div}{\mathop{\mathrm{div}}} \renewcommand{\Im}{\mathop{\mathrm{Im}}} \renewcommand{\Re}{\mathop{\mathrm{Re}}} \renewcommand{\ss}{\mathop{\mathrm{ss}}} \newcommand{\elliptic}{\mathop{\mathrm{ell}}} \newcommand{\new}{\mathop{\mathrm{new}}} \newcommand{\old}{\mathop{\mathrm{old}}} \newcommand{\Bs}{\boldsymbol} %\newcommand{\ds}{\displaystyle} %\newcommand{\f}{\mathfrak} \newcommand{\s}{\mathcal} %\newcommand{\A}{\mathbb{A}} %\newcommand{\C}{\mathbb{C}} \newcommand{\F}{\mathbb{F}} \newcommand{\Fpbar}{\bar{\mathbb{\F}}_p} \newcommand{\G}{\mathbb{G}} \newcommand{\Gm}{\mathbb{G}_{\mathrm{m}}} \newcommand{\N}{\mathbb{N}} \renewcommand{\P}{\mathbb{P}} \newcommand{\Q}{\mathbb{Q}} %\newcommand{\R}{\mathbb{R}} %\newcommand{\R}{\mathbf{R}} \newcommand{\T}{\mathbb{T}} \newcommand{\V}{\mathcal{V}} \newcommand{\Z}{\mathbb{Z}} \newcommand{\E}{\mathbf{E}} \renewcommand{\H}{\mathrm{H}} \newcommand{\M}{\mathbf{M}} \renewcommand{\S}{\mathbf{S}} \newcommand{\var}{\mathbf{Var}} \newcommand{\eps}{\varepsilon} \newcommand{\erf}{\operatorname{erf}} \newcommand{\rar}{\rightarrow} \newcommand{\lar}{\leftarrow} \newcommand{\hrar}{\hookrightarrow} \renewcommand{\iff}{\Longleftrightarrow} \newcommand{\xrar}{\xrightarrow} \newcommand{\rrar}{\longrightarrow} \newcommand{\mt}{\mapsto} \newcommand{\mmt}{\longmapsto} \newcommand{\angles}[1]{\langle #1\rangle} \newcommand{\ceiling}[1]{\lceil #1\rceil} \newcommand{\floor}[1]{\lfloor #1\rfloor} \newcommand{\set}[2]{\{\,#1\,\,|\,\,#2\,\}} \renewcommand{\emph}{\it} \renewcommand{\em}{\emph} $\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}$

Chapter 16

Visualizing different numerical methods.

Comparing explicit Euler, implicit Euler, and trapezoidal methods.

In this chapter, we learned three numerical methods for solving ordinary differential equations approximately on a computer. For simplicity we will focus on the scalar-valued autonomous case.

Consider an ODE of the form \[ \frac{dx}{dt} = f(x) \] with initial condition $x(t_0)=x_0$. The goal is to approximate $x(t)$ on the interval $t\in[t_0,t_0+T]$ for a chosen time duration $T > 0$. The explicit (or forward) Euler method for step size $h = T/N>0$ is the collection of approximations $x_i$ to $x(t_i)$ where $x_0$ is the given initial value and recursively \begin{equation} \label{eqn:nm-explicit} x_{i+1} = x_i + h f(x_i) \end{equation} for $h = T/N > 0$ and $i = 0, 1, \dots, N-1$.

The implicit (or backward) Euler method for step size $h = T/N$ is the collection of approximations $x_i$ to $x(t_i)$ where $x_0$ is the given initial value and for $i = 0, \dots, N-1$ the value $x_{i+1}$ is the solution near $x_i$ to the equation \begin{equation}\label{eqn:nm-implicit} x = x_i + h f(x), \quad i=0,\ldots,N-1. \end{equation}

The trapezoidal method for step size $h = T/N$ is the collection of approximations $x_i$ to $x(t_i)$ where $x_0$ is the given initial value and for $i = 0, \dots, N-1$ the value $x_{i+1}$ is the solution near $x_i$ to the equation \begin{equation}\label{trapeqn} x = x_i + h\,\frac{f(x_i)+f(x)}{2}\,\,\,\, \mbox{ for }\,\,\,\,\, i = 0, 1, \dots, N-1. \end{equation}

Below we give two examples of how the solutions of the three methods (explicit Euler, implicit Euler, and trapezoidal) approach to the exact solution. You can adjust the time step size using the slider. You can show or hide a curve by clicking on its legend. As $h$ is made smaller, you'll see the numerical method plots approach the blue exact solution curve. As you vary $h$, you will sometimes see blue exact solution curve move too: that curve really is not changing; what is happening is that the vertical axis scale sometimes changes to accommodate a smaller range of needed values for the output of the numerical methods. When you hover over the box, typically all that shows are black and blue number rectangles corresponding to coordinates of a point on the blue exact solution curve. When the black number is an integer multiple of $h$, then the output of the numerical methods also appears.

Example 1
ODE

ODE: $x'(t) = x(t)$, $x(0) = 1.$

Exact solution: $x(t) = e^{t}.$


Step Size


Example 2
ODE

ODE: $x'(t) = (x(t))^2 - 4$, $x(0) = 1.$

Exact solution: $x(t) = \dfrac{6 - 2 e^{4 t}}{3 + e^{4 t}}.$

Step Size



Comparing different numerical methods for your favorite ODE or ODE system.

This widget will allow you to obtain numerical solutions to first-order initial value problems of your own choice, and this widget does the same thing for first-order 2-dimensional ODE systems.